/**
 * IPC路由管理器
 * 统一管理和注册所有主进程与渲染进程之间的IPC通信处理程序
 * 提供计算、文件操作、规范管理等核心功能的IPC接口
 * 实现进程间安全、高效的通信机制
 * 
 * 该类负责注册和管理所有IPC通信处理程序，将前端请求路由到相应的后端服务
 * 通过集中管理IPC处理程序，提高代码的可维护性和可扩展性
 */
import { ipcMain } from 'electron';
import { RainfallService } from './services/calculation/rainfallService';
import { CaveService } from './services/calculation/caveService';
import { StratumService } from './services/calculation/stratumService';
import { CrossingService } from './services/calculation/crossingService';
import { TestService } from './services/testService';
import { TunnelCalculatorService, TunnelSurroundingRockService } from './services/calculation/tunnelService';
import { DocxHelper } from './utils/docxHelper';
import { ExcelCsvHelper } from './utils/ExcelCsvHelper';

import { RegulationIpcService } from './services/regulationIpcService';
import { FileOperationIpcService } from './services/fileOperationIpcService';
import { UtilityIpcService } from './services/utilityIpcService';

export class IpcRouter {
  /**
   * 统一错误响应格式
   * @param error 错误对象
   * @param defaultMessage 默认错误消息
   * @returns 标准化的错误响应对象
   */
  private static createErrorResponse(error: any, defaultMessage: string): { success: false; error: string } {
    const errorMessage = error instanceof Error ? error.message : String(error || defaultMessage);
    console.error(defaultMessage, error);
    return { success: false, error: errorMessage };
  }

  /**
   * 清理文件名，移除不合法字符
   * 
   * @param name 原始文件名
   * @returns 清理后的安全文件名
   * 
   * 该方法会移除Windows和Unix系统中的非法字符，防止文件操作异常
   * 同时处理Windows保留字和文件名长度限制
   */
  public static sanitizeFilename(name: string): string {
    if (!name || typeof name !== 'string') return 'file';
    
    // 移除所有非法字符（包括Windows和Unix系统中的非法字符）
    let safe = name.replace(/[\\/:*?"<>|\x00-\x1F\x7F]/g, '');
    
    // 移除前后空白字符
    safe = safe.trim();
    
    // 移除结尾的点号和空格（Windows不允许）
    while (safe.endsWith('.') || safe.endsWith(' ')) {
      safe = safe.slice(0, -1);
    }
    
    // 防止保留字（Windows）
    const reservedNames = /^(CON|PRN|AUX|NUL|COM[1-9]|LPT[1-9])$/i;
    if (reservedNames.test(safe)) {
      safe = `_${safe}_`;
    }
    
    // 确保文件名不为空
    if (safe.length === 0) {
      safe = 'file';
    }
    
    // 限制最大长度（Windows文件名最长255字符）
    if (safe.length > 255) {
      const extMatch = safe.match(/\.[^\.]+$/);
      const ext = extMatch ? extMatch[0] : '';
      const baseName = ext ? safe.slice(0, -ext.length) : safe;
      safe = baseName.slice(0, 255 - ext.length) + ext;
    }
    
    return safe;
  }

  /**
   * 初始化所有IPC处理程序
   * 按功能模块注册各类IPC处理器
   * 调用此方法启动所有IPC通信功能
   * 
   * 该方法应在主窗口创建后调用，确保IPC通信通道正常工作
   */
  static init() {
    this.registerCalculationHandlers();
    this.registerRegulationHandlers();
    this.registerFileHandlers();
    this.registerOtherHandlers();
  }

  /**
   * 注册计算相关的IPC处理程序
   * 提供各类工程计算功能的统一接口
   * 实现计算逻辑与UI的分离
   * 
   * 通过计算类型映射表，将不同的计算请求路由到相应的服务方法
   * 支持雨量计算、溶洞土压力、落石冲击、安全岩盘厚度、穿跨越计算等多种计算类型
   */
  private static registerCalculationHandlers() {
    /**
     * 计算处理程序映射表
     * 键为计算类型标识符，值为对应的计算方法
     * 支持雨量计算、溶洞土压力、落石冲击、安全岩盘厚度、穿跨越计算等
     * 
     * 通过这种映射方式，可以动态扩展新的计算类型，只需添加新的映射项即可
     */
    const calculationHandlers: Record<string, (params: any) => Promise<any>> = {
      // 雨量计算相关
      'storm-index': RainfallService.calculateStormIndex,
      'peak-flood-flow': RainfallService.calculatePeakFloodFlow,
      'peak-rainfall-hr': RainfallService.calculatePeakRainfallHr,
      'slope-k2': RainfallService.calculateSlopeK2,
      'drainage-area-k1': RainfallService.calculateDrainageAreaK1,
      'design-duration-t': RainfallService.calculateDesignDurationT,
      'point-rainfall-12': RainfallService.calculatePointRainfall12,
      'area-rainfall': RainfallService.calculateAreaRainfall,
      'point-area-coefficient-24': RainfallService.calculatePointAreaCoefficient24,
      'point-area-coefficient-12': RainfallService.calculatePointAreaCoefficient12,
      'point-area-coefficient-6': RainfallService.calculatePointAreaCoefficient6,
      'select-storm-parameter-d': RainfallService.calculateSelectStormParameterD,
      'all-rainfall': RainfallService.calculateAllRainfall,
      
      // 溶洞土压力计算相关
      'cave-soil-pressure': CaveService.calculateCaveSoilPressure,//深埋洞土压力
      'cave-soil-pressure-shallow': CaveService.calculateCaveSoilPressureShallow,//浅埋洞土压力
      'deep-infinite': CaveService.calculateDeepInfinite,
      'qws': CaveService.calculateQws,
      'qwx': CaveService.calculateQwx,
      'qys': CaveService.calculateQys,
      'qyx': CaveService.calculateQyx,
      'lateral-soil-pressure': CaveService.calculateLateralSoilPressure,
      // 恢复为简单映射，动态逻辑放在前端处理
      'cave-pressure-coefficient': CaveService.calculateQws,
      
      // 落石冲击荷载计算相关
      'rock-impact-load': CaveService.calculateRockImpactLoad,
      'rock-impact-strength': CaveService.calculateRockImpactStrength,
      
      // 安全岩盘厚度计算相关
      'thickness-rock-stratum-top': StratumService.calculateThicknessRockStratumTop,
      'thickness-rock-stratum-bottom': StratumService.calculateThicknessRockStratumBottom,
      'thickness-rock-stratum-side': StratumService.calculateThicknessRockStratumSide,

      // 穿跨越计算相关
      'crossing-foundation-calculation': CrossingService.calculateFoundation,
      'crossing-triangular-truss-calculation': CrossingService.triangularTrussCalculation,
      'crossing-inverted-triangular-truss-calculation': CrossingService.invertedTriangularTrussCalculation,
      'crossing-rectangular-truss-calculation': CrossingService.calculateRectangularTrussCalculation,
      'crossing-inverted-triangular-truss-load-calculation': CrossingService.calculateInvertedTriangularTrussLoad,
      'crossing-inverted-triangular-truss-external-load-calculation': CrossingService.calculateInvertedTriangularTrussExternalLoad,
      'crossing-calculate-pipe-load': CrossingService.calculatePipeLoad,
      'crossing-calculate-external-load': CrossingService.calculateExternalLoad,
      'truss-weld-calculation': CrossingService.trussWeldCalculate,
      'truss-column-reinforcement': CrossingService.columnReinforcement,
      
      // 测试计算相关
      'demo-1': TestService.calculateTest1,
      // 动态输入计算处理
      'demo-2': TestService.calculateTest2,
      
      // 隧道计算相关
      'tunnel-lenth-calculation': TunnelCalculatorService.calculateTunnelLength,
      'tunnel-depth-calculation': TunnelCalculatorService.calculateTunnelDepth,
      // 隧道洞口高程计算
      'tunnel-entrance-exit-elevation-calculation': TunnelCalculatorService.calculateTunnelEntranceExitElevation,
      // 隧道围岩长度计算
      'tunnel-surrounding-rock-lining-length': TunnelSurroundingRockService.calculateTunnelLiningLength,
      
      // 文档导出
      'export-report-docx': DocxHelper.exportReportDocx,
      
      // Excel和CSV导出
      'export-report-excel': ExcelCsvHelper.exportToExcel,
      'export-report-csv': ExcelCsvHelper.exportToCsv,
      
    };

    /**
     * 统一的计算IPC处理程序
     * 作为所有计算功能的入口，根据计算类型动态调用对应的处理函数
     * @param event IPC事件对象
     * @param calculationType 计算类型
     * @param params 计算参数
     * @returns 计算结果或错误信息
     * 
     * 该处理程序通过计算类型映射表查找对应的处理函数，实现动态路由
     * 如果找不到对应的处理函数，则返回错误信息
     */
    ipcMain.handle('perform-calculation', async (event, { calculationType, params }) => {
      const handler = calculationHandlers[calculationType];
      if (!handler) {
        return { success: false, error: `Unknown calculation type: ${calculationType}` };
      }
      
      try {
        return await handler(params);
      } catch (error) {
        return this.createErrorResponse(error, `执行${calculationType}计算失败`);
      }
    });
  }

  /**
   * 注册规范文件相关的IPC处理程序
   * 管理规范文件的加载、添加、删除、打开和保存功能
   * 
   * 委托给RegulationIpcService类处理具体的规范文件操作
   */
  private static registerRegulationHandlers() {
    RegulationIpcService.registerHandlers();
  }
  
  /**
   * 注册文件操作相关的IPC处理程序
   * 提供文件打开等基础文件操作功能
   * 
   * 委托给FileOperationIpcService类处理具体的文件操作
   */
  private static registerFileHandlers() {
    FileOperationIpcService.registerHandlers();
  }

  /**
   * 注册其他类型的IPC处理程序
   * 提供ping、文件导入等辅助功能
   * 
   * 委托给UtilityIpcService类处理其他辅助功能
   */
  private static registerOtherHandlers() {
    UtilityIpcService.registerHandlers();
  }
}